/*
* Copyright 2014 eXo Platform SAS
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.juzu.tutorial.juzcret.step7.services;
import org.exoplatform.services.jcr.ext.app.SessionProviderService;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
import org.juzu.tutorial.juzcret.step7.models.Comment;
import org.juzu.tutorial.juzcret.step7.models.Secret;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import java.util.*;
@Singleton
public class SecretServiceJCRImpl implements SecretService {
private static final String SECRET_APP = "SecretApplication";
private static final String CREATED_DATE = "exo:createdDate";
private static final String ID = "exo:id";
private static final String IMAGE_URL = "exo:imageURL";
private static final String LIKES = "exo:likes";
private static final String MESSAGE = "exo:message";
private static final String CONTENT = "exo:content";
private static final String USER_ID = "exo:userId";
private static final String SECRET_NODE_TYPE = "exo:secret";
private static final String COMMENT_NODE_TYPE = "exo:secretComment";
@Inject
private SessionProviderService sessionService;
@Inject
private NodeHierarchyCreator nodeCreator;
@PostConstruct
public void initialize() {
if (getSecrets().size() == 0) {
addFakeSecrets();
}
}
@Override
public List<Secret> getSecrets() {
List<Secret> secrets = new LinkedList<Secret>();
try {
Node secretHome = getSecretHome();
NodeIterator iterChild = secretHome.getNodes();
while (iterChild.hasNext()) {
secrets.add(buildSecret(iterChild.nextNode()));
}
return secrets;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public void addSecret(String message, String imageUrl) {
String id = UUID.randomUUID().toString();
try {
Node secretHome = getSecretHome();
Node secret = secretHome.addNode(id, SECRET_NODE_TYPE);
secret.setProperty(ID, id);
secret.setProperty(MESSAGE, message);
secret.setProperty(IMAGE_URL, imageUrl);
secret.setProperty(CREATED_DATE, Calendar.getInstance());
secret.getSession().save();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Comment addComment(String secretId, Comment comment) {
String id = UUID.randomUUID().toString();
try {
Node secret = getSecretNode(secretId);
if (secret != null) {
Node cNode = secret.addNode(id, COMMENT_NODE_TYPE);
cNode.setProperty(ID, id);
cNode.setProperty(USER_ID, comment.getUserId());
cNode.setProperty(CONTENT, comment.getContent());
cNode.setProperty(CREATED_DATE, Calendar.getInstance());
cNode.getSession().save();
return buildComment(cNode);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public Set<String> addLike(String secretId, String userId) {
try {
Node secret = getSecretNode(secretId);
if (secret != null) {
Set<String> likes = new HashSet<String>();
if (secret.hasProperty(LIKES)) {
Value[] values = secret.getProperty(LIKES).getValues();
for (Value v : values) {
likes.add(v.getString());
}
}
likes.add(userId);
secret.setProperty(LIKES, likes.toArray(new String[likes.size()]));
secret.save();
return likes;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private Node getSecretNode(String secretId) {
try {
Node secretHome = getSecretHome();
Node secret = secretHome.getNode(secretId);
return secret;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private void addFakeSecrets() {
addSecret("Yesterday I said I missed my PL meeting because I have to many work. In fact I was drinking free beer in Barbetta pub",
"https://c1.staticflickr.com/3/2385/2345543856_6d0fbafb66_z.jpg?zz=1");
addSecret("I have a master degree but I still use Google to calculate 3*8",
"https://yy2.staticflickr.com/7244/7245177220_3f17ee9fb8_z.jpg");
addSecret("I am in relationship for 2 years. He is awesome, powerful and I never go out without him. His name is Linux",
"http://fc02.deviantart.net/fs71/f/2009/364/9/d/christmas_love_by_skubaNiec.jpg");
addSecret("I spent 2 hours a day to train my cat to perform a backflip",
"http://fc06.deviantart.net/fs15/i/2007/008/e/b/colour_cat_wallpaper_by_jellyplant.jpg");
addSecret("I pretend to be a spy when I go out. In reality my job is to perform photocopy at the embassy",
"https://c2.staticflickr.com/2/1230/5108154392_3cc02cac67_z.jpg");
}
private Secret buildSecret(Node secretNode) throws RepositoryException {
Secret secret = new Secret();
List<Comment> comments = new LinkedList<Comment>();
NodeIterator commentIter = secretNode.getNodes();
while (commentIter.hasNext()) {
comments.add(buildComment(commentIter.nextNode()));
}
secret.setComments(comments);
secret.setCreatedDate(secretNode.getProperty(CREATED_DATE).getDate().getTime());
secret.setId(secretNode.getProperty(ID).getString());
secret.setImageURL(secretNode.getProperty(IMAGE_URL).getString());
Set<String> likes = new HashSet<String>();
if (secretNode.hasProperty(LIKES)) {
for (Value userID : secretNode.getProperty(LIKES).getValues()) {
likes.add(userID.getString());
}
}
secret.setLikes(likes);
secret.setMessage(secretNode.getProperty(MESSAGE).getString());
return secret;
}
private Comment buildComment(Node commentNode) throws RepositoryException {
Comment comment = new Comment();
comment.setContent(commentNode.getProperty(CONTENT).getString());
comment.setCreatedDate(commentNode.getProperty(CREATED_DATE).getDate().getTime());
comment.setId(commentNode.getProperty(ID).getString());
comment.setUserId(commentNode.getProperty(USER_ID).getString());
return comment;
}
private Node getSecretHome() throws Exception {
SessionProvider sProvider = sessionService.getSystemSessionProvider(null);
Node publicApp = nodeCreator.getPublicApplicationNode(sProvider);
try {
return publicApp.getNode(SECRET_APP);
} catch (Exception e) {
Node secretApp = publicApp.addNode(SECRET_APP, "nt:unstructured");
publicApp.getSession().save();
return secretApp;
}
}
}